package org.iamd.service;

import java.text.ParseException;
import java.util.Date;

import org.quartz.CronTrigger;
import org.quartz.Job;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.Trigger;
import org.quartz.impl.StdSchedulerFactory;

/**
 * Опаковка на фонов сервиз.
 * 
 * @author И. Атанасов
 */
public class ServiceWrapper {

	/** Детайли за даден процес. */
	private JobDetail jDetail;

	/** Тригер, съдържащ и стартиращ процеса. */
	private Trigger trigger;

	/**
	 * Инстанциране на тригер и описание на процес.
	 * 
	 * @param triggerName
	 *            име на тригер
	 * @param pattern
	 *            шаблон на време на изпълнение
	 * @param startDate
	 *            дата на стартиране
	 * @param serviceName
	 *            име на сервиз
	 * @param executorClass
	 *            клас изпълнител
	 * 
	 * @throws ParseException
	 *             при крив <b>pattern</b>
	 */
	public ServiceWrapper(String triggerName, String pattern, Date startDate, String serviceName,
			Class<? extends Job> executorClass) throws ParseException {
		this.trigger = new CronTrigger(triggerName, Scheduler.DEFAULT_GROUP, pattern);
		this.trigger.setStartTime(startDate);
		this.jDetail = new JobDetail(serviceName, Scheduler.DEFAULT_GROUP, executorClass);
	}

	/**
	 * @return описание на процес
	 */
	public JobDetail getDetail() {
		return this.jDetail;
	}

	/**
	 * @return тригер на процес
	 */
	public Trigger getTrigger() {
		return this.trigger;
	}

	/**
	 * Проверка дали процесът е стартиран или спрян.
	 * 
	 * @return <code>true</code> ако е стартиран, иначе <code>false</code>
	 * 
	 * @throws SchedulerException
	 *             при неуспешна проверка
	 */
	public boolean isActive() throws SchedulerException {
		for (String string : StdSchedulerFactory.getDefaultScheduler().getJobNames(
				this.jDetail.getGroup())) {
			if (string.equals(this.trigger.getJobName())) {
				return true;
			}
		}
		return false;
	}

}